package logica.pessoa;

import java.io.Serializable;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import criptografia.Encriptador;

/**
 * Objeto que herda de pessoa fisica (e de pessoa), e guarda as informacoes
 * de um usuario do Sistema da locadora (funcionarios locadores e o gerente).
 * @author Equipe Localisa (Usa quem precisa!)
 */
public class Locador extends PessoaFisica implements Serializable {
   
	private transient static final long serialVersionUID = 1L;
	private String login;
    private String senha;
    private transient Encriptador encriptador;
    private boolean ehGerente;

    public Locador(){
    	
        super();
        this.login = null;
        this.senha = null;
        this.ehGerente = false;
        this.encriptador = null;
        
    }
    
    /**
     * @return O login do locador
     */
    public String getLogin() {
        return login;
    }

    /**
     * Muda o login do locador
     * @param login O novo login
     * @throws Exception Se o  novo login nao for valido (nao estiver
	 * de acordo com o formato especificado no sistema)
     */
    public void setLogin(String login) throws Exception {
        if (! validaLogin(login)) {
            throw new Exception ("\n \t<Login invalido!>");
        }
        this.login = login;
    }

    /**
     * @return A senha do locador
     */
    public String getSenha() {
        return senha;
    }

    /**
     * Muda a senha do locador
     * @param senha A nova senha
     * @throws Exception Se a nova senha nao for valida (nao estiver
     * de acordo com o formato especificado no sistema)
     */
    public void setSenha(String senha) throws Exception {
        if (senha == null || senha.length() <= 4)
            throw new Exception ("\n \t<Senha invalida!>");
        this.encriptador = new Encriptador();
        this.senha = encriptador.geraHashParaSenha(senha);
    }
    
    /**
     * @return True se o locador eh gerente e False caso contrario
     */
    public boolean getEhGerente() {
		return ehGerente;
	}

    /**
     * Muda o atributo ehGerente do locador
     * @param ehGerente O novo atributo ehGerente
     */
    public void setEhGerente(boolean ehGerente) {
    	this.ehGerente = ehGerente;
    }

    /**
     * @return Uma representacao em String que informa se o locador eh apenas
     * locador ou tambem gerente
     */
    private String getTipoDeFuncionario() {
    	String tipoDeFuncionario;
    	
    	if (this.ehGerente) {
    		tipoDeFuncionario = "Gerente";
    	} else {
    		tipoDeFuncionario = "Locador";
    	}
    	
    	return tipoDeFuncionario;
    }
    
    // Valida o login, verificando se ele possui apenas caracteres
    // alfanumericos, com o primeiro caractere sendo obrigatoriamente alfabetico
    // e com o tamanho minimo de 5 caracteres
    
    private boolean validaLogin(String login) {
    	if (login == null || login.trim().isEmpty()) {
    		return false;
    	}
    	
    	Pattern pLogin = Pattern.compile("([a-z]([a-z0-9])*){5,}");
		
		Matcher mLogin = pLogin.matcher(login);
		
		return mLogin.matches();
    }
   
    
    /**
	 * Compara um objeto Locador com um outro, verificando se
	 * seus atributos login, RG e CPF sao iguais
	 * @return True se os objetos sao iguais e False caso contrario
	 */
    
    @Override
    public boolean equals(Object object){
        if (!(object instanceof Locador))
            return false;
        
        return (this.getLogin().equals(((Locador)object).getLogin()) || super.equals(object));
    }
    
	/**
	 * Mostra uma representacao do objeto em String, revelando alguns
	 * de seus atributos
	 * @return Uma representacao em String do objeto Locador/Gerente
	 */
	@Override
	public String toString(){
		String format = "";
		format += "\n \t ______________________________________________________________\n";
		format += "\n \t "+this.getTipoDeFuncionario()+" cod. "+this.getMatricula()+" Login "+this.getLogin();
		format += "\n \t Nome: "+this.getNome();
		format += "\n \t CPF: "+this.getCPF()+" RG: "+this.getRG();
		format += "\n \t Email: "+this.getEmail();
		format += "\n \t Data de nascimento: "+this.getDataDeNascimento();
		format += "\n \t Naturalidade: "+this.getNaturalidade();
		format += "\n \t "+this.getEndereco();
		format += "\n \t ______________________________________________________________\n";
		return format;
	}

}